/**
 * Created by HUANGFR2 on 8/19/2016.
 */
const mongoose = require('mongoose');
var Merchant = mongoose.model("Merchant");
var Dish = mongoose.model("Dish");
var request = require('request');
var async = require('async');

exports.findAll = function(req, res){
    //var merchant = new Merchant();
    Merchant.find({}, function (err, merchants) {
        if(err){
            console.error('find all merchants error : ' + err);
            resError(res, 'find all merchants error : ' + err);
        }else {
            if(merchants.length != 0){
                request('http://zha-ita113-w7:3038/merchantWebService/merchant', function (error, response, data) {
                    if (!error && response.statusCode == 200) {
                        try{
                            var merchantsStr = JSON.parse(data);
                            merchants.forEach(function (merchant) {
                                merchant.detail = merchantsStr[merchant._id];
                            });
                            res.json({
                                msg : 'SUCCESS',
                                merchants : merchants
                            });
                        } catch (err) {
                            resError(res, 'request Merchant Server error : Server Error');
                        }
                    } else if(error){
                        console.error('request Merchant Server error : ' + error);
                        resError(res, 'request Merchant Server error : ' + error);
                    } else {
                        console.error('request Merchant Server status error');
                        resError(res, 'request Merchant Server status error')
                    }
                })
            } else {
                res.json({
                    msg : 'SUCCESS',
                    merchants : merchants
                });
            }
        }
    });
};

exports.updateMerchantStatus = function (req, res) {
    var mid = req.body.mid;
    var status = req.body.status;
    Merchant.findOne({_id : mid}, function (err, merchant) {
        if(err){
            console.error('find merchant error : ' + err);
            resError(res, 'find merchant error : ' + err);
        } else {
            merchant.status = status;
            merchant.save(function (err) {
                if(err){
                    console.error('update merchant status error : ' + err);
                    resError(res, 'update merchant status error : ' + err);
                } else {
                    if(status == 3){
                        disableDish(merchant._id, function (err) {
                            if(err){
                                console.error('block dish error : ' + err);
                                resError(res, 'block dish error : ' + err);
                            } else {
                                res.json({
                                    msg : 'SUCCESS',
                                    merchant : merchant
                                })
                            }
                        });
                    } else {
                        res.json({
                            msg : 'SUCCESS',
                            merchant : merchant
                        })
                    }
                }
            });
        }
    })
};

exports.findLowAll = function(req, res){
    Merchant.find({ $and: [ { "low_warning": { $exists: true } }, { "low_warning": true } ] }, function (err, merchants) {
        if(err){
            console.error('find low grade merchant error : ' + err);
            resError(res, 'find low grade merchant error : ' + err);
        }else {
            var mids = [];
            merchants.forEach(function(merchant){
                mids.push(merchant._id);
            });
            var formData = {
                mids : JSON.stringify(mids)
            };
            if(merchants.length != 0){

                request.post({
                    url: 'http://zha-ita113-w7:3038/merchantWebService/merchant',
                    formData: formData
                }, function optionalCallback(err, httpResponse, body) {
                    if (err) {
                        console.error('request merchant server error : ', err);
                        resError(res, 'request merchant server error : ', err);
                        return;
                    }
                    try{
                        var merchants_ = JSON.parse(body);
                        merchants.forEach(function (merchant) {
                            merchant.detail = merchants_[merchant._id];
                        });
                        res.json({
                            msg : 'SUCCESS',
                            merchants : merchants
                        })
                    } catch (err) {
                        resError(res, 'request Merchant Server error : Server Error');
                    }
                });
            }else {
                res.json({
                    msg : 'SUCCESS',
                    merchants : merchants
                })
            }
        }
    })
};

//exports.updateLowMerchant = function (req, res) {
//    var mid = req.body.mid;
//    var status = req.body.status;
//    Merchant.findOne({_id : mid}, function (err, merchant) {
//        if(err){
//            console.error('find merchant error : ' + err);
//            resError(res, 'find merchant error : ' + err);
//            return;
//        }
//        merchant.status = status;
//        merchant.low_warning = false;
//        merchant.save(function (err) {
//            if(err){
//                console.error('update merchant status error : ' + err);
//                resError(res, 'update merchant status error : ' + err);
//            }else {
//                if(status == 3){
//                    disableDish(merchant._id);
//                }
//                res.json({
//                    msg : 'SUCCESS',
//                    merchant : merchant
//                })
//            }
//        })
//    });
//};

function disableDish(mid, cb_){
    Dish.find({merchant : mid}, function (err, dishs) {
        if(err){
            console.error('find block dish error : ' + err);
        } else {
            async.each(dishs, function (dish, cb) {
                if(dish.status != 2){
                    dish.status = 2;
                    dish.save(function (err) {
                        if(err){
                            cb(err);
                        } else {
                            cb();
                        }
                    });
                } else {
                    cb();
                }
            }, function (err) {
                if(err){
                    cb_(err);
                } else {
                    cb_();
                }
            });
        }
    });
    //Dish.update({merchant : mid}, {$set : {status : 2}}, function (err) {
    //    if(err){
    //        cb(err);
    //    } else {
    //        cb();
    //    }
    //})
}

exports.findBlackMerchant = function (req, res) {
    Merchant.find({ $or: [ { "status": 2 }, { "status": 3 }, { "status": 0 } ] }, function (err, merchants) {
        if(err){
            console.error('find black merchant error : ' + err);
            resError(res, 'find black merchant error : ' + err);
        } else {
            var mids = [];
            merchants.forEach(function (merchant) {
                mids.push(merchant._id);
            });
            res.json(mids);
        }
    })
};

exports.checkMerchantStatus = function (req, res) {
    var mid = req.params.mid;
    Merchant.findOne({_id : mid}, function (err, merchant) {
        if(err){
            console.error('check merchant status error : ' + err);
            resError(res, 'check merchant status error : ' + err);
        } else {
            if (merchant) {
                res.json(merchant.status)
            }
            else {
                resError(res, 'check merchant status error : ' + err);
            }
        }
    })
};

function resError(res, error){
    res.json({
        error : error
    })
}